package cn.kinoko.common.utils;


import cn.kinoko.common.base.model.BaseEnum;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class EnumUtils {

    /**
     * 判断枚举状态是否包含在 enumStatusList 内
     * @param enumStatus     要判断的枚举值
     * @param enumStatusList 枚举值集合
     * @return true 包含 ，false 不包含
     */
    public static <T> boolean in(T enumStatus, List<T> enumStatusList) {
        if (enumStatus == null) {
            return false;
        }
        return enumStatusList.contains(enumStatus);
    }

    /**
     * 判断枚举状态是否包含在 enumStatusList 内
     * @param enumStatus     要判断的枚举值
     * @param enumStatusList 枚举值集合
     * @return true 包含 ，false 不包含
     */
    public static boolean in(Integer enumStatus, Integer... enumStatusList) {
        return in(enumStatus, Arrays.asList(enumStatusList));
    }

    /**
     * 判断枚举状态是否包含在 enumStatusList 内
     * @param enumStatus     要判断的枚举值
     * @param enumStatusList 枚举值集合
     * @return true 包含 ，false 不包含
     */
    public static boolean notIn(Integer enumStatus, Integer... enumStatusList) {
        return !in(enumStatus, enumStatusList);
    }

    /**
     * 获取所有枚举项
     * @param enumType 枚举类型
     * @param <E>      EnumClass
     * @return 枚举项列表
     */
    public static <E extends Enum<?>> List<E> getEnumItems(Class<E> enumType) {
        return Arrays.asList(enumType.getEnumConstants());
    }

    /**
     * 判断是否包含枚举项
     * @param enumType 枚举类型
     * @param code     枚举值
     * @param <E>      EnumClass
     * @return 是否包含枚举项
     */
    public static <E extends BaseEnum<?>> boolean contains(Class<E> enumType, Object code) {
        return Arrays.stream(enumType.getEnumConstants()).anyMatch(e -> e.getCode().equals(code));
    }

    /**
     * 根据code获取枚举项
     * @param enumType 枚举类型
     * @param code     枚举值
     * @param <T>      枚举值类型
     * @param <E>      枚举类型
     * @return 枚举项
     */
    public static <T, E extends BaseEnum<T>> BaseEnum<T> getEnum(Class<E> enumType, T code) {
        for (E enumConstant : enumType.getEnumConstants()) {
            if (Objects.equals(enumConstant.getCode(), code)) {
                return enumConstant;
            }
        }
        throw new IllegalArgumentException("枚举值[" + code + "]不存在");
    }

}